package com.eonmind.common.provider.entity.user;

import com.eonmind.common.contract.enums.DelEnum;
import com.eonmind.common.contract.timer.Timer;
import com.mongoplus.annotation.ID;
import com.mongoplus.annotation.collection.CollectionName;
import com.mongoplus.enums.IdTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.FieldNameConstants;

/**
 * 用户通知偏好配置实体类
 */
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@CollectionName("userNotificationPreference")
@FieldNameConstants
public class UserNotificationPreference {
    // 定义通知方式常量
    public static final int NOTICE_TYPE_IN_SITE = 1;     // 0b001 或 1<<0
    public static final int NOTICE_TYPE_EMAIL = 2;       // 0b010 或 1<<1
    public static final int NOTICE_TYPE_SMS = 4;         // 0b100 或 1<<2

    /**
     * 主键ID
     */
    @ID(type = IdTypeEnum.AUTO)
    private Long id;

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 通知类型ID(关联通知类型表)
     */
    private Long noticeTypeId;

    /**
     * 通知方式配置
     * 使用位运算表示不同通知方式的组合:
     * 1-站内信
     * 10-邮件
     * 100-短信
     * 例如:
     * 1 表示仅接收站内信
     * 11 表示接收站内信和邮件
     * 111 表示接收站内信、邮件和短信
     */
    private Integer configNum = NOTICE_TYPE_IN_SITE | NOTICE_TYPE_EMAIL | NOTICE_TYPE_SMS;

    /**
     * 创建时间
     */
    private Long createTime = Timer.currentTimestamp();

    /**
     * 更新时间
     */
    private Long updateTime = Timer.currentTimestamp();

    /**
     * 是否删除(0-未删除 1-已删除)
     */
    private Integer del = DelEnum.UN_DEL.getCode();


    /**
     * 判断用户是否接收指定通知方式
     *
     * @param noticeType 通知方式类型
     * @return 是否接收该类型通知
     */
    public boolean isNoticeEnabled(int noticeType) {
        return (configNum & noticeType) == noticeType;
    }

    /**
     * 设置接收指定通知方式
     *
     * @param noticeType 通知方式类型
     * @param enabled    是否启用
     */
    public void setNoticeEnabled(int noticeType, boolean enabled) {
        if (enabled) {
            configNum |= noticeType;  // 启用指定通知
        } else {
            configNum &= ~noticeType;  // 关闭指定通知
        }
        updateTime = Timer.currentTimestamp();
    }
}
